package com.shujia.scala

import scala.io.Source

object Demo27Match {
  def main(args: Array[String]): Unit = {
    /**
     * 模式匹配
     *
     * java中的模式匹配可以匹配基本数据类型，字符串，枚举
     *
     * scala的模式匹配，可以匹配基本数据类型，字符串，对象，元组，数组，匹配类型
     *
     */

    /**
     * 1、匹配基本数据类型
     *
     * 模式匹配只有一个能匹配成功
     * 下划线代表其其它情况
     * 在写代码是需要考虑到所有的情况
     *
     */
    val i = 1000

    i match {
      case 10 =>
        println("i的值是10")
      case 20 =>
        println("i的值是20")
      case 100 =>
        println("i的值是100")
      case _ =>
        println("其他")
    }

    /**
     * 2、匹配字符串
     *
     */
    val str: String = "java"

    str match {
      case "java" =>
        println("java")
      case "spark" =>
        println("spark")
      case _ => println("其它")
    }

    /**
     * 3、匹配元组
     *
     */
    val t: (String, Int, String) = ("张三", 23, "001")

    t match {
      case (name: String, age: Int, id: String) =>
        println(s"$name\t$age\t$id")
    }

    //替代下划线
    val (name: String, age: Int, id: String) = t
    println(s"$name\t$age\t$id")

    /**
     * 4、匹配数组
     */

    val array: Array[Any] = Array("001", "李四")

    array match {
      case Array(id: String, name: String, age: Int) =>
        println(s"$id\t$name\4$age")

      case Array(id: String, name: String) =>
        println(s"$id\t$name")
    }


    /**
     * 5、匹配类型
     *
     */
    val obj: Any = true

    obj match {
      case i: Int =>
        println(s"obj是一个Int类型：$i")
      case s: String =>
        println(s"obj是一个String类型:$s")
      case d: Double =>
        println(s"obj是一个Double类型:$d")
      case _ =>
        println(s"其它类型：$obj")
    }


    /**
     * 模式匹配可以有返回值
     *
     */

    val i1: Int = 100

    val ty: String = i1 % 2 match {
      case 1 => "奇数"
      case 0 => "偶数"
    }

    println(ty)


    /**
     * 模式匹配在map集合的使用
     *
     */
    val map = Map("001" -> "张三", "002" -> "李四")
    println(map.getOrElse("006", "默认值"))

    /**
     * Option：是一个可选的取值有有两个取值
     * Some ：有值
     * None: 没有值
     *
     */
    val value: Option[String] = map.get("005")
    println(value)

    val mvalue: String = map.get("003") match {
      case Some(v) => v
      case None => "默认值"
    }
    println(mvalue)


    /**
     * 模式匹配结合函数的使用
     *
     */
    val lines: List[String] = Source.fromFile("data/students.txt").getLines().toList

    //按照逗号分割数据
    val arrays: List[Array[String]] = lines.map(line => line.split(","))

    //匹配取出数据
    val students: List[(String, String, String, String, String)] = arrays.map {
      case Array(id: String, name: String, age: String, gender: String, clazz: String) =>
        (id, name, age, gender, clazz)
    }

    students.foreach(println)


  }

}
